package com.example.juc.kingdom_adventures.term4;

import org.junit.Test;

public class Client {
    private int number = 0;
    private final Object lock = new Object();
    // 标志是否写入完成
    private boolean writeComplete = false;

    /**
     * 这次的问题在于现在读写方法都需要获取锁，一旦进入 read 函数，write 函数就必须等待，直到 read 函数释放锁
     * 而一旦read函数获取到锁，由于无法走完while循环，也就无法释放锁，导致write函数无法继续重新竞争到锁，+1操作无法执行，导致程序无法向下推进
     */
    private void read() {
        synchronized (lock) {
            // 如果还没有写入完成，循环等待直到写入完成
            while (!writeComplete) {
                System.out.println("等待写入完成...");
            }
            System.out.println("number = " + number);
        }
    }

    private void write(int change) {
        synchronized (lock) {
            number += change;
            System.out.println("写入 " + number);
        }
    }

    @Test
    public void test() throws InterruptedException {
        // 开启一个线程写入 100 次 number
        new Thread(() -> {
            writeComplete = false;
            for (int i = 0; i < 100; i++) {
                write(1);
            }
            writeComplete = true;
        }).start();

        // 开启一个线程读取 100 次 number
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                read();
            }
        }).start();

        // 睡眠一秒保证线程执行完成
        Thread.sleep(1000);
    }
}

